<template>
	<view>
		//摄像头设置
		<camera device-position="front" flash="off" class="camera" error="error" v-if="showCamera"></camera>
		<image mode="widthFix" class="image" :src="photoPath" v-if="showImage"></image>

		<view class="operate-container">
			//主要按钮，拍照或者重拍
			<button type="primary" class="btn" @tap="clickBtn" :disabled="!canCheckin">{{ btnText }}</button>
			//重拍
			<button type="warn" class="btn" @tap="afresh" :disabled="!canCheckin">重拍</button>
		</view>

		//文字内容设置
		<view class="notice-container">
			<text class="notice">注意事项</text>
			<text class="desc">
				拍照签到的时候，必须要拍摄自己的正面照片，侧面照片会导致无法识别。另外，拍照的时候不要戴墨镜或者帽子，避免影响拍照签到的准确度。（DesignBy:骆发茂）
			</text>
		</view>
	</view>
</template>

<script>
var QQmapWX = require('../../lib/qqmap-wx-jssdk.min.js');
var qqmapsdk;
export default {
	data() {
		return {
			canCheckin: true,
			photoPath: '',
			btnText: '拍照',
			showImage: false,
			showCamera: true
		};
	},
	onLoad: function() {
		qqmapsdk = new QQMapWX({
			key: 'TXHBZ-EGDLU-FBYVG-26V5P-Q27KF-M7BI5'
		});
	},
	//检查是否可以考勤，ajax发请求
	//当前时间段可否签到
	onShow: function() {
		let that = this;
		//发送ajax请求，不发送图片，用封装好的ajax方法
		//that.ajax的参数：传路径、请求方式、没有发送过去的数据、返回函数
		that.ajax(that.url.validCanCheckIn, 'GET', null, function(resp) {
			let msg = resp.data.msg;
			if (msg != '可以考勤') {
				that.canCheckin = false;
				setTimeout(function() {
					uni.showToast({
						title: msg,
						icon: 'none'
					});
				}, 1000);
			}
		});
	},
	methods: {
		//单单是一个clickBtn事件，但是要去确定  签到时间\人脸\地区风险
		//前端会发送   人脸照片、地理位置信息给后端
		//而后端会做
		// (1) 验证当前时间，能不能签到，有没有迟到，会记录打卡时间；
		//（2）接收前端发送来的照片，去人脸识别，识别成功与否会告诉给前端（成功就继续，不成功就创建人脸模型、或者告诉前端报错）
		//（3）发送告警邮件，这是与人脸识别异步（后端开启异步线程，需要线程池）一起的，高风险就由后端发送邮件告警
		clickBtn: function() {
			let that = this;
			//如果是拍照情况，就获取微信拍照api，调用摄像头，填写api参数
			//显示拍照true，显示图片false
			if (that.btnText == '拍照') {
				let ctx = uni.createCameraContext();
				ctx.takePhoto({
					quality: 'high',
					success(resp) {
						console.log(resp.tempImagePath);
						photoPath = resp.tempImagePath;
						that.showCamera = false;
						that.showImage = true;
						that.submitButtonText = '签到';
					}
				});
			}
			//如果不是拍照，else就是签到的情况,  签到要确定   人脸识别+地理位置确定
			else {
				uni.showLoading({
					title: '签到中请稍后'
				});
				//不管怎么样，30s之后就隐藏showLoading其他情况也可以隐藏showLoading
				setTimeout(function() {
					uni.hideLoading();
				}, 30000);
				//---------------------------获取当前位置GPS，通过  腾讯地理位置服务  转换成  位置信息----------------------------------------------------------------------------------------------------------------
				//uni.getLocation获取经纬度，但经纬度需要转换成地址位置信息，通过腾讯地理位置信息转换
				//仅限APP能直接获取到地址位置信息，小程序只能获得GPS，需要腾讯云的地址位置服务转换成位置信息
				uni.getLocation({
					type: 'wgs84',
					success: function(resp) {
						//获取到经纬度
						let latitude = resp.latitude;
						let longitude = resp.longitude;
						//通过腾讯地理位置信息转换
						qqmapsdk.reverseGeocoder({
							location: {
								latitude: latitude,
								longitude: longitude
							},
							//存储通过腾讯地理位置信息转换的位置信息
							success: function(resp) {
								// console.log(resp.result)
								let address = resp.result.address;
								let addressComponent = resp.result.address_component;
								let nation = addressComponent.nation;
								let province = addressComponent.province;
								let city = addressComponent.city;
								let district = addressComponent.district;
								//------------------------上面获取到了位置信息，//向后端传输数据，头像、地址信息、token--------------------------------------------------------------------------------------------------------------------------
								uni.uploadFile({
									url: that.url.checkin,
									filePath: that.photoPath,
									name: 'photo',
									header: {
										token: uni.getStorageSync('token')
									},
									formData: {
										address: address,
										country: nation,
										province: province,
										city: city,
										district: district
									},

									//----------------------------传给后端后，如果是    500&&不存在人脸模型，提醒信息 ----------------------------------------------------------------------------------------------------------------------------
									success: function(resp) {
										if (resp.statusCode == 500 && resp.data == '不存在人脸模型') {
											uni.hideLoading();
											uni.showModal({
												title: '提示消息',
												content: '系统中不存在你的人脸识别模型，是否用当前这张照片作为人脸识别模型？',
												//就询问是否创建人脸模型，是-》创建成功/创建失败
												success: function(res) {
													////向后端传输信息
													if (res.confirm) {
														uni.uploadFile({
															url: that.url.createFaceModel,
															filePath: that.photoPath,
															name: 'photo',
															header: {
																token: uni.getStorageSync('token')
															},
															//创建人脸模型失败
															success: function(resp) {
																if (resp.statusCode == 500) {
																	uni.showToast({
																		title: resp.data,
																		icon: 'none'
																	});
																}
																//创建人脸模型成功
																else if (resp.statusCode == 200) {
																	uni.showToast({
																		title: '人脸建模成功',
																		icon: 'none'
																	});
																}
															}
														});
													}
												}
											});
										}
										//--------------------传给后端后，最好的情况是(签到成功)   返回状态码的情况200成功，直接签到成功------------------------------------------------------------------------------------------------------------------
										//
										else if (resp.statusCode == 200) {
											//将string转成json
											let data = JSON.parse(resp.data);
											//业务状态吗code（401，402，200，500）
											let code = data.code;
											let msg = data.msg;
											if (code == 200) {
												uni.hideLoading();
												uni.showToast({
													title: '签到成功',
													icon: 'none',
													complete: function() {}
												});
											}
										}
										//------------------------//传给后端后，后端验证错误，返回状态码的情况500，失败---------------------------------------------------------------------------------------------------------------------------------
										else if (resp.statusCode == 500) {
											uni.showToast({
												title: resp.data,
												icon: 'none'
											});
										}
									}
								});
							}
						});
					}
				});
			}
		}
	}
};
</script>

<style lang="less">
@import url('checkin.less');
</style>
